package com.example.chat.config;

import javax.servlet.http.HttpSession;
import javax.websocket.HandshakeResponse;
import javax.websocket.server.HandshakeRequest;
import javax.websocket.server.ServerEndpointConfig;

/**
 * 配置类
 * 用于从 ServerEndpointConfig 中 获取 httpSession 对象
 * extends ServerEndpointConfig.Configurator：继承官方提供的配置器，可以在连接建立前修改握手行为。
 */

/**
 * 这个类的作用是：在 WebSocket 握手阶段，
 * 把 HTTP 的 HttpSession 对象保存下来，
 * 方便后面在 @OnOpen 方法里用 EndpointConfig 取出这个用户的登录信息。
 */
public class GetHttpSessionConfig extends ServerEndpointConfig.Configurator {
    /**
     * 这个方法是 WebSocket 建立连接前，服务器处理“握手”的最后一步，可以：
     * 读取请求中的信息（比如 cookies、session、headers）；
     * 把你想要的东西放进 ServerEndpointConfig 的 userProperties，后续就可以用
     * @param sec
     * @param request
     * @param response
     */
    @Override
    public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request,
        HandshakeResponse response) {
        HttpSession httpSession = (HttpSession)request.getHttpSession();
        //将 httpsession 存入 ServerEndpointConfig对象，方便于websocket在OnOpen()建立链接后获取
        sec.getUserProperties().put(HttpSession.class.getName(),httpSession);
    }
}
/*
🔍 具体逻辑解释：
第一步：获取 HTTP 的 HttpSession

HttpSession httpSession = (HttpSession) request.getHttpSession();
这里从握手请求中获取浏览器用户的 HTTP 会话；

前提是这个用户已经登录了，服务器之前已经用 session.setAttribute("user", xxx) 保存了信息。

第二步：保存到 ServerEndpointConfig 中

sec.getUserProperties().put(HttpSession.class.getName(), httpSession);
sec.getUserProperties() 是一个 Map<String, Object>，可以把任何你想传给 WebSocket 的信息保存进去；

把 HttpSession 保存进来，以 HttpSession.class.getName() 为 key，避免字符串硬编码。

🚪 在哪里生效？—— 在你的 @ServerEndpoint 注解里👇
@ServerEndpoint(value = "/chat", configurator = GetHttpSessionConfig.class)
这样写之后，每次有 WebSocket 客户端连接 /chat，Spring 会调用你写的 GetHttpSessionConfig.modifyHandshake() 方法；

然后把 HTTP 会话放进去；
最终你在 @OnOpen 里就能这样拿到：
this.httpSession = (HttpSession) config.getUserProperties()
    .get(HttpSession.class.getName());
✅ 总结一句话：
GetHttpSessionConfig 就是一个“中转工”，它负责把传统登录用的 HttpSession 从 HTTP 世界带到 WebSocket 世界，让你在 WebSocket 中也能知道“这个连接是谁”。
 */
